package pe.com.bbva.ge.domain.solicitud;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.TableGenerator;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import pe.com.bbva.ge.domain.base.Auditoria;
import pe.com.bbva.ge.domain.configuracion.Posicion;
import pe.com.bbva.ge.domain.configuracion.Transportadora;
import pe.com.bbva.ge.domain.configuracion.Valor;
import pe.com.bbva.ge.domain.seguridad.Usuario;


/**
 * The persistent class for the SOL_SOLICITUD database table.
 * 
 */
@Entity
@Table(name="SOL_SOLICITUD")
public class Solicitud extends Auditoria {
	private static final long serialVersionUID = 1L;
	
	@Id
	@Column(unique = true, nullable = false, precision = 19)
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "SEQ_SOLICITUD")
	@TableGenerator(name = "SEQ_SOLICITUD", 
	table = Solicitud.SEQ_TABLA, 
	pkColumnName = Solicitud.SEQ_TABLA_PK, 
	initialValue = 1, 
	valueColumnName = Solicitud.SEQ_TABLA_COLUMN, 
	pkColumnValue = "pe.com.bbva.ge.domain.solicitud.Solicitud", 
	allocationSize = 1)	
	private long id;
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((numero == null) ? 0 : numero.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Solicitud other = (Solicitud) obj;
		if (numero == null) {
			if (other.numero != null)
				return false;
		} else if (!numero.equals(other.numero))
			return false;
		return true;
	}
	
	//

	private Date atencion;

	private BigDecimal cotizacion;

	private String numero;

	private Boolean patron;

	private String pedido;

	private Boolean programado;

	private String referencia;
	
	@Column(name="MOT_RECHAZO")
	private String motivoRechazo;

	//uni-directional many-to-one association to Posicion
	@ManyToOne
	@JoinColumn(name="ORIGEN")
	private Posicion origen;

	//uni-directional many-to-one association to Valor
	@ManyToOne
	@JoinColumn(name="TIPO_ORIGEN")
	private Valor tipoOrigen;

	//uni-directional many-to-one association to Valor
	@ManyToOne
	@JoinColumn(name="TRANSPORTADORA")
	private Transportadora transportadora;

	//uni-directional many-to-one association to Usuario
	@ManyToOne
	@JoinColumn(name="SOLICITANTE")
	private Usuario solicitante;

	//uni-directional many-to-one association to Usuario
	@ManyToOne
	@JoinColumn(name="RESPONSABLE")
	private Usuario responsable;

	//uni-directional many-to-one association to EstadoSolicitud
	@ManyToOne
	@JoinColumn(name="ESTADO")
	private EstadoSolicitud estado;

	//uni-directional many-to-one association to TipoSolicitud
	@ManyToOne
	@JoinColumn(name="TIPO")
	private TipoSolicitud tipo;
	
	//bi-directional many-to-one association to Destino
	@OneToMany(mappedBy="solicitud", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
	@Fetch(FetchMode.SELECT)
	private List<Destino> destinos;
	
	public Date getAtencion() {
		return this.atencion;
	}

	public void setAtencion(Date atencion) {
		this.atencion = atencion;
	}

	public BigDecimal getCotizacion() {
		return this.cotizacion;
	}

	public void setCotizacion(BigDecimal cotizacion) {
		this.cotizacion = cotizacion;
	}

	public String getNumero() {
		return this.numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public Boolean getPatron() {
		return this.patron;
	}

	public void setPatron(Boolean patron) {
		this.patron = patron;
	}

	public String getPedido() {
		return this.pedido;
	}

	public void setPedido(String pedido) {
		this.pedido = pedido;
	}

	public Boolean getProgramado() {
		return this.programado;
	}

	public void setProgramado(Boolean programado) {
		this.programado = programado;
	}

	public String getReferencia() {
		return this.referencia;
	}

	public void setReferencia(String referencia) {
		this.referencia = referencia;
	}

	public List<Destino> getDestinos() {
		return this.destinos;
	}

	public void setDestinos(List<Destino> destinos) {
		this.destinos = destinos;
	}

	public Destino addDestino(Destino destino) {
		getDestinos().add(destino);
		destino.setSolicitud(this);

		return destino;
	}

	public Destino removeDestino(Destino destino) {
		getDestinos().remove(destino);
		destino.setSolicitud(null);

		return destino;
	}
	
	public Posicion getOrigen() {
		return this.origen;
	}

	public void setOrigen(Posicion origen) {
		this.origen = origen;
	}

	public Valor getTipoOrigen() {
		return this.tipoOrigen;
	}

	public void setTipoOrigen(Valor tipoOrigen) {
		this.tipoOrigen = tipoOrigen;
	}

	public Transportadora getTransportadora() {
		return this.transportadora;
	}

	public void setTransportadora(Transportadora transportadora) {
		this.transportadora = transportadora;
	}

	public Usuario getSolicitante() {
		return this.solicitante;
	}

	public void setSolicitante(Usuario solicitante) {
		this.solicitante = solicitante;
	}

	public Usuario getResponsable() {
		return this.responsable;
	}

	public void setResponsable(Usuario responsable) {
		this.responsable = responsable;
	}

	public EstadoSolicitud getEstado() {
		return this.estado;
	}

	public void setEstado(EstadoSolicitud estado) {
		this.estado = estado;
	}

	public TipoSolicitud getTipo() {
		return this.tipo;
	}

	public void setTipo(TipoSolicitud tipo) {
		this.tipo = tipo;
	}
	public String getMotivoRechazo() {
		return motivoRechazo;
	}
	public void setMotivoRechazo(String motivoRechazo) {
		this.motivoRechazo = motivoRechazo;
	}

}